#include<iostream>
#include<string>
#include<regex>

int main()
{
    //std::string str ="get /bitejiuyeke/login?user=xiaoming&pass=123123 HTTP/1.1\r\n";
    std::string str ="get gitee.com/qigezi/tcp-server/tree/master/source?user=xiaoming&pass=123123 HTTP/1.1\r\n";
    //std:: regex e("(GET|POST) ([^?]*)  (HTTP)");

    std::smatch sm;

    
    //std::regex e("(GET|HEAD|POST|PUT|DELETE) ([^?]*)(?:\\?(.*))?(?:\n|\r\n)?", std::regex::icase);
    //std::regex e("(GET|HEAD|POST|PUT|DELETE) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\n|\r\n)?", std::regex::icase);
    //GET|HEAD|POST|PUT|DELETE   表示匹配并提取其中任意一个字符串
    //[^?]*     [^?]匹配非问号字符， 后边的*表示0次或多次
    //\\?(.*)   \\?  表示原始的？字符 (.*)表示提取?之后的任意字符0次或多次，知道遇到空格
    //HTTP/1\\.[01]  表示匹配以HTTP/1.开始，后边有个0或1的字符串
    //(?:\n|\r\n)?   （?: ...） 表示匹配某个格式字符串，但是不提取， 最后的？表示的是匹配前边的表达式0次或1次
    //std::regex e("(GET|HEAD|POST|PUT|DELETE) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\n|\r\n)?", std::regex::icase);

    //std::regex e("(GET|HEAD|POST|PUT|DELETE) ([^?].*)(?:\\?[.*])? (Http/1\\.[01])(?:\n|\r\n)?", std::regex::icase);
    //(?:\\?(.*))? 这部分是一个非捕获组，用于匹配可选的查询字符串。如果查询字符串不存在，这个部分将不会捕获任何内容，matches[3] 将是一个空字符串。
    std::regex e("(GET|HEAD|POST|PUT|DELETE) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\n|\r\n)?", std::regex::icase);
    bool ret=std::regex_match(str,sm,e);

    
    for(auto& m:sm)
    {
        std::cout<<m<<std::endl;
    }

    // std::cout<<sm[0]<<std::endl;
    // std::cout<<sm[1]<<std::endl;
    // std::cout<<sm[2]<<std::endl;



    return 0;
}